package bebetes.test;

import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;
import visu.Positionnable;
import bebetes.Bebete;
import bebetes.BebeteEmergente;
import bebetes.BebeteHasard;
import bebetes.ChampDeBebetes;

/**
 * Classe de tests pour la classe {@link ChampDeBebetes}.
 * <p>
 * Test de la méthode {@link bebetes.ChampDeBebetes#fabriqueBebetes(Class, int)}.
 * 
 * @author gnpt
 */
public class ChampDeBebetesTest2 extends TestCase {

	private ChampDeBebetes champDeBebetes = null;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
	}

	@Override
	protected void tearDown() throws Exception {
		super.tearDown();
	}

	/**
	 * Test si la fabrique crée bien des bébête de type passé en paramètre.
	 * <p>
	 * Premièrement, on utilise l'appel explicite à fabriqueBebetes, en passant
	 * en paramètre l'objet Class décrivant la classe des objets à créer, puis
	 * le nombre de bebètes à créer.
	 */
	public void testFabriqueBebetesHasard() {
		this.champDeBebetes = new ChampDeBebetes(640, 480, 1);
		List<? extends Bebete> actualReturn = this.champDeBebetes
				.fabriqueBebetes(BebeteHasard.class, 10);

		/* On s'assure que le bon nombre d'objet a été crée */
		assertEquals("Nombre de Bébêtes fabriquées", 10, actualReturn.size());

		/*
		 * On s'assure ensuite que le type de chacun des éléments est bien celui
		 * demandé.
		 */
		Iterator<? extends Bebete> iter = actualReturn.iterator();
		while (iter.hasNext()) {
			Object item = (Object) iter.next();
			if (!(item instanceof BebeteHasard))
				fail("Bébête autre que BebeteHasard dans la liste");
		}
	}

	/**
	 * Pour ce test, on utilise l'appel implicite à fabriqueBebetes depuis le
	 * constructeur. Le type des bêbètes est BebeteEmergente par défaut.
	 */
	public void testFabriqueBebeteImplicite() {
		/*
		 * On fabrique un champs de Bebete de 100x100 pixels, contenant 12
		 * bêbètes. Pourquoi 12 ? car c'est un petit nombre, ce qui permet
		 * d'avoir des tests assez rapides, on aurait pu mettre 1573, mais avec
		 * une complexité linéaire, ce test aurait été long.
		 */
		this.champDeBebetes = new ChampDeBebetes(100, 100, 12);
		/* On récupère une Collection<Positionnable> */
		List<? extends Positionnable> list = this.champDeBebetes
				.getPositionnables();
		/* On vérifie la taille de la collection */
		assertEquals("Nombre de bêbètes cohérent.", 12, list.size());
		/* Et on test s'il s'agit bien d'instances de BebeteEmergente */
		for (Positionnable p : list) {
			assertTrue("C'est bien une bêbète émergente", BebeteEmergente.class
					.isInstance(p));
		}
	}
}
